"""
自定义的分页组件
如果想要使用这个分页的类，需要以下几步：
    1 引入这个类，并把查询出来的数据传递给类的实例化对象
        queryset = models.PrettyNum.objects.filter(**data_dict).order_by('-id') ## 根据自己的需求获取部分或者全部数据
        from app_01.utils.pagination import Pagination
        page_object = Pagination(request,queryset) ## 把查询出来的数据传递到分页类中
    2 获取分好页的数据，生成的页码
        page_queryset = page_object.page_queryset  ## 获取分完页面的数据
        page_string = page_object.html()  ## 获取生成的页码
    3 把数据传递给前端并显示出来
        context = {
                'queryset':page_queryset, ## 分完页后的数据，传给前端用来生成每页展示的数据
               'page_string':page_string, ## 生成的页码，传给前端用来在下面生成页码
               'search_data':search_data  ## 要查询的数据
               }
        return render(request,'pretty_list.html',context)

    4 在前端应用后端传递过来的数据
            {% for item in queryset %} 这里的queryset是数据分好页后传送过来的page_queryset，如果使用未分页的数据将会不显示分页效果
                。。。
              <div style="margin-top: -25px">
                <ul class="pagination">
                    {{ page_string }}
                </ul>
            </div>
"""
import math
import copy
from django.utils.safestring import mark_safe


class Pagination(object):

    def __init__(self,request,queryset,page_param="page",page_size=5,plus = 5):
        #page = int(request.GET.get(page_param,1)) ## page的数值通过传递过来的request和page_param来确定。
        ### page不能直接转为int(),还需要判断获得的数据是不是数字。page是数字就转为整形，不是的话让page=1

        query_dict = copy.deepcopy(request.GET)
        # query_dict._mutable = True
        self.query_dict = query_dict  ## 为了保留页码原来的参数，把原来的参数深度copy一份


        page = str(request.GET.get(page_param, 1))
        if page.isdigit():
            page = int(page)
        else:
            page = 1


        ## 封装和初始化需要的参数
        self.page_parm = page_param
        self.page = page ## 页码数据
        self.page_size = page_size ## 每页的数据量
        self.start = (self.page - 1) * self.page_size ## 计算开始的页码
        self.end = self.page * self.page_size ## 计算结束的页码
        self.page_queryset = queryset[self.start:self.end] ## 获取查询出来的数据中的从第self.start条到第self.end条之间的数据
        self.total_count = queryset.count() ## 计算获取数据的总条数
        self.total_page_count = math.ceil(self.total_count / self.page_size) ## 计算数据的总页码数，向上取整
        self.plus = plus

    def html(self): ## 定义生成页码组件的函数

        if self.page <= self.plus or self.page == '':
            start_page = 1
            if self.total_page_count < 2 * self.plus:
                end_page = self.total_page_count
            else:
                end_page = 2 * self.plus
        else:
            if (self.page + self.plus) > self.total_page_count:
                if self.total_page_count < 2 * self.plus:
                    start_page = 1
                else:
                    start_page = self.total_page_count - 2 * self.plus
                end_page = self.total_page_count
            else:
                start_page = self.page - self.plus
                end_page = self.page + self.plus
        page_str_list = []
        ### 首页
        self.query_dict.setlist(self.page_parm,[1]) ## 首页让page=1
        page_str_list.append('<li><a href="?{}">首页</a></li>'.format(self.query_dict.urlencode()))

        ### 上一页
        if self.page > 1:
            self.query_dict.setlist(self.page_parm, [self.page - 1])
            prev = '<li><a href="?{}">上一页</a></li>'.format(self.query_dict.urlencode())
        else:
            self.query_dict.setlist(self.page_parm, [1])
            prev = '<li><a href="?{}">上一页</a></li>'.format(self.query_dict.urlencode())
        page_str_list.append(prev)
        ### 中间页码
        for i in range(start_page, end_page + 1):
            self.query_dict.setlist(self.page_parm, [i])
            if self.page == i: ## 高亮显示当前页
                ele = '<li class="active"><a href="?{}">{}</a></li>'.format(self.query_dict.urlencode(), i)
            else:
                ele = '<li><a href="?{}">{}</a></li>'.format(self.query_dict.urlencode(), i)
            page_str_list.append(ele)

        ### 下一页
        if self.page < self.total_page_count:
            self.query_dict.setlist(self.page_parm, [self.page + 1])
            prev = '<li><a href="?{}">下一页</a></li>'.format(self.query_dict.urlencode())
        else:
            self.query_dict.setlist(self.page_parm, [self.total_page_count])
            prev = '<li><a href="?{}">下一页</a></li>'.format(self.query_dict.urlencode())
        page_str_list.append(prev)

        ### 尾页
        self.query_dict.setlist(self.page_parm, [self.total_page_count])
        page_str_list.append('<li><a href="?{}">尾页</a></li>'.format(self.query_dict.urlencode()))

        ### 跳转页面。已经让输入框的name属性等于page了，由于form表单是get模式，所以当点击按钮时会自动在url后面加上：？page=XXX
        search_string = """
               <li>
                               <form style="float: left;margin-left: -1px" method="get">
                                   <input name="page" style="position: relative;float: left;display:inline-block;width: 80px;border-radius: 0;"
                                   type="text" class="form-control" placeholder="页码">
                                   <button style="border-radius: 0" class="btn btn-default" type="submit">跳转</button>
                               </form>
                           </li>
           """
        page_str_list.append(search_string)
        page_string = mark_safe(''.join(page_str_list))  ## 字符串标记为安全字符串，这样可以正常显示页码

        return page_string









